# —*— coding = utf-8 -*-
# @Time :2021/12/3117:34
# @File :lorenz.py
# @Software: PyCharm
'''
////////////////////////////////////////////////////////////////////
//                          _ooOoo_                               //
//                         o8888888o                              //
//                         88" . "88                              //
//                         (| ^_^ |)                              //
//                         O\  =  /O                              //
//                      ____/`---'\____                           //
//                    .'  \\|     |//  `.                         //
//                   /  \\|||  :  |||//  \                        //
//                  /  _||||| -:- |||||-  \                       //
//                  |   | \\\  -  /// |   |                       //
//                  | \_|  ''\---/''  |   |                       //
//                  \  .-\__  `-`  ___/-. /                       //
//                ___`. .'  /--.--\  `. . ___                     //
//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
//      ========`-.____`-.___\_____/___.-`____.-'========         //
//                           `=---='                              //
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//         佛祖保佑       永无BUG     永不修改                       //
////////////////////////////////////////////////////////////////////
'''
import copy

import matplotlib.pyplot as plt
import numpy as np


'''
Lorenz吸引子生成函数
参数为三个初始坐标，三个初始参数,迭代次数
返回三个一维list
'''
def Lorenz(x0,y0,z0,p,q,r,T):
  #微分迭代步长
  h=0.01
  global x
  x=[]
  global y
  y=[]
  global z
  z=[]
  for t in range(T):
    xt=x0+h*p*(y0-x0)
    yt=y0+h*(q*x0-y0-x0*z0)
    zt=z0+h*(x0*y0-r*z0)
    #x0、y0、z0统一更新
    x0,y0,z0=xt,yt,zt
    x.append(x0)
    y.append(y0)
    z.append(z0)


def main():
  #设定参数
  p=10
  q=28
  r=8/3
  #迭代次数
  T=10000
  #设初值
  x0=-16
  y0=-21
  z0=33

  Lorenz(x0,y0,z0,p,q,r,T)
  ax1=plt.subplot(121,projection="3d")
  ax1.set_xlabel('x(t)')
  ax1.set_ylabel('y(t)')
  ax1.set_zlabel('z(t)')
  ax1.set_title('befor')
  x1 = copy.deepcopy(x)
  y1 = copy.deepcopy(y)
  z1 = copy.deepcopy(z)
  #初值微小的变化
  x0=-16
  y0=-21
  z0=33.00001
  Lorenz(x0,y0,z0,p,q,r,T)
  ax2=plt.subplot(122,projection="3d")
  ax2.set_xlabel('x(t)')
  ax2.set_ylabel('y(t)')
  ax2.set_zlabel('z(t)')
  ax2.set_title('after')

  ax1.scatter(x1, y1, z1, s=5)
  ax2.scatter(x, y, z, s=5)
  plt.show()

  t=np.arange(0,T)
  plt.scatter(t,x1,s=1)
  plt.scatter(t,x,s=1)
  plt.show()


if __name__=='__main__':
  main()
